#include <cstdlib>
#include <cstdio>

#include "LinkStack.h"

// 初始化
LinkStack* Init_LinkStack() {
    LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack));
    if(NULL == stack) {
        perror("malloc err: ");
        return NULL;
    }

    // 初始化
    stack->head.next = NULL;
    stack->size      = 0;

    return stack;
}

// 入栈: 把 dt 插入到链表的头部
int Push_LinkStack(LinkStack* stack, LinkNode* dt) {
    if(NULL == stack) {
        return -1;
    }
    if(NULL == dt) {
        return -2;
    }

    dt->next         = stack->head.next;
    stack->head.next = dt;
    stack->size++;

    return 0;
}

// 获得栈顶元素
LinkNode* front_LinkStack(LinkStack* stack) {
    if(NULL == stack) {
        return NULL;
    }
    if(0 == stack->size) {
        return NULL;
    }

    // 其实就是返回栈中首元素
    return stack->head.next;
}

// 出栈
int Pop_LinkStack(LinkStack* stack) {
    if(NULL == stack) {
        return -1;
    }
    if(0 == stack->size) {
        return -2;
    }

    // 删除链表中的首元素
    LinkNode* pNext  = stack->head.next;
    stack->head.next = pNext->next;
    pNext->next      = NULL;  // 可有可无

    stack->size--;

    return 0;
}

// 获得栈中元素个数
int GetSize_LinkStack(LinkStack* stack) {
    if(NULL == stack) {
        return -1;
    }

    return stack->size;
}

// 清空栈
int Clear_LinkStack(LinkStack* stack) {
    if(NULL == stack) {
        return -1;
    }

    stack->head.next = NULL;
    stack->size      = 0;

    return 0;
}

// 销毁栈
int Destroy_LinkStack(LinkStack* stack) {
    if(NULL == stack) {
        return -1;
    }

    if(stack != NULL) {
        free(stack);
        stack = NULL;
    }

    return 0;
}